/**
 * 1.Promise就是一个类 在执行这个类的时候 需要传递一个执行器进去 执行器会立即执行
 * 2.Promise中有三种状态 分别为 成功(fulfilled) 失败(rejected) 等待(pending)
 *   pending->fulfilled
 *   pending->rejected
 *   一旦状态确定就不可更改
 * 3.resolve和reject函数是用来更改状态的
 *   resolve：fulfilled
 *   reject：rejected
 * 4.then方法内部做的事情就是判断状态 如果状态是成功则调用成功回调函数 如果状态失败则调用失败回调函数 then方法是被定义在原型对象上的
 * 5.then成功回调有一个参数 表示成功之后的值 then失败回调有一个参数 表示失败后的原因
 * 6.同一个promise对象下面的then方法是可以被调用多次的
 * 7.then方法是可以被链式调用的，后面的then方法的回调函数拿到的值是上一个then方法的回调函数的返回值
 */

const MyPromise = require("./MyPromise1");

let promise = new MyPromise((resolve, reject) => {
  // setTimeout(() => {
  //   //resolve等待，then方法立即执行
  //   resolve("成功......");
  // }, 1000);
  // resolve("成功");
  reject("失败");
});

// promise.then(
//   (x) => {
//     console.log(x);
//   },
//   (x) => {
//     console.log(x);
//   }
// );
// // .catch(console.log);
// console.log(promise.status);
// promise.resolve();
// function other() {
//   return new MyPromise((resolve, reject) => {
//     reject("other");
//   });
// }
function p1() {
  return new MyPromise((resolve, reject) => {
    setTimeout(function () {
      resolve("p1");
    }, 2000);
  });
}
function p2() {
  return new MyPromise((resolve, reject) => {
    resolve("p2");
  });
}

MyPromise.race(["a", "b", p1(), p2(), "c"]).then((result) => {
  console.log(result);
});

// MyPromise.resolve("resolve").then((v) => console.log(v));
// MyPromise.resolve(p1()).then((v) => console.log(v));

// p2()
//   .finally(() => {
//     console.log("finally");
//     return p1();
//   })
//   .then(
//     (value) => {
//       console.log(value);
//     },
//     (reason) => {
//       console.log(reason);
//     }
//   );
// let p1 = promise.then(
//   (value) => {
//     console.log(value);
//     return p1;
//   },
//   (reason) => {
//     console.log(reason);
//   }
// );

// p1.then(
//   () => {},
//   (reason) => {
//     console.log("-------" + reason.message);
//   }
// );

// promise
//   .then(
//     (value) => {
//       console.log(value);
//       return 100000;
//       // throw new Error("then error");
//     }
//     // (reason) => {
//     //   console.log(reason);
//     //   return new Promise((resolve, reject) => {
//     //     resolve(100);
//     //   });
//     // }
//   )
//   .then()
//   .then()
//   .then(
//     (value) => {
//       console.log(value);
//       // return other();
//     },
//     (reason) => {
//       console.log(reason);
//     }
//   );
// .then(
//   (value) => {
//     console.log(value);
//   },
//   (value) => {
//     console.log(value);
//   }
// );
// promise.then(
//   (value) => {
//     console.log(value + "1");
//   },
//   (reason) => {
//     console.log(reason);
//   }
// );
// promise.then(
//   (value) => {
//     console.log(value + "2");
//   },
//   (reason) => {
//     console.log(reason);
//   }
// );
